/**
 * 
 */
package model.trivial_pursuit;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;

import model.Params;

import database.Clause;
import database.IDbConnector;
import database.MySQLConnector;
import database.ValuedAttribute;

/**
 * @author Aubry Pirian
 *
 */
public class ListCards {
	
	protected IDbConnector idbc;					// l'interface d'accès
	
	private static final String DB_TYPE = Params.DB_TYPE;			// le type de la base de données utilisée
	
	private static final String DB_SERVER = Params.DB_SERVER;	// l'adresse du serveur de base de données
	private static final String DB_USER = Params.DB_USER;		// le nom d'utilisateur
	private static final String DB_PASSWD = Params.DB_PASSWD;	// le mot de passe
	private static final String DB_NAME = Params.DB_NAME;		// le nom de la base
	
	/**
	 * @throws ClassNotFoundException : impossible d'accéder au driver
	 * @throws SQLException
	 * @throws NoSuchFieldException : paramètre non valide
	 */
	public ListCards() throws ClassNotFoundException, SQLException, NoSuchFieldException {
		if (DB_TYPE.equals("mysql")) {
			try {
				this.idbc = new MySQLConnector(DB_SERVER,DB_USER,DB_PASSWD,DB_NAME);
			} catch (NoSuchFieldException e) {
				throw e;
			}
		} else {
			this.idbc=null;
			throw new NoSuchFieldException("SGBD non géré.");
		}
		try {
			this.connect();
		} catch (SQLException e) {
			throw e;
		} catch (ClassNotFoundException e) {
			throw e;
		}
	}
	
	/**
	 * Méthode créant une nouvelle connexion à la base de données spécifiée
	 * @throws ClassNotFoundException : impossible d'accéder au driver
	 * @throws SQLException 
	 */
	public void connect() throws ClassNotFoundException, SQLException {
		try {
			this.idbc.connect();
		} catch (ClassNotFoundException e) {
			throw e;
		} catch (SQLException e) {
			throw e;
		}
	}
	
	/**
	 * Méthode retournant la liste des cartes enregistrées dans la base de données
	 * au format "id:theme:couleur:[[question]]:[[réponse]]"
	 * @param theme	: theme de la carte
	 * @param color	: numéro de la couleur de la carte
	 * @throws NoSuchFieldException : paramètre non valide
	 * @throws SQLException 
	 * @throws ClassNotFoundException : impossible d'accéder au driver
	 */
	public LinkedList<String> readCards (int theme, int color) throws NoSuchFieldException, SQLException, ClassNotFoundException {
		LinkedList<String> cards = new LinkedList<String>();
		Clause where;
		if ( theme>-1) {
			Clause ct;
			try {
				ct = new Clause( new ValuedAttribute("theme",theme) );
			} catch (NoSuchFieldException e) {
				throw e;
			}
			if (color>-1) {
				Clause cc;
				try {
					cc = new Clause( new ValuedAttribute("color",color) );
					where = new Clause("AND",ct,cc);
				} catch (NoSuchFieldException e) {
					throw e;
				}
			} else {
				where = ct;
			}
		} else {
			Clause cc;
			if (color>-1) {
				try {
					cc = new Clause( new ValuedAttribute("color",color) );
				} catch (NoSuchFieldException e) {
					throw e;
				}
			} else {
				cc = null;
			}
			where = cc;
		}
		ResultSet rs;
		if (where!=null) {
			try {
				rs = this.idbc.select(TPParams.CARD_TABLE,where);
			} catch (SQLException e) {
				throw e;
			} catch (NoSuchFieldException e) {
				throw e;
			}
		} else {
			try {
				rs = this.idbc.select(TPParams.CARD_TABLE);
			} catch (SQLException e) {
				throw e;
			} catch (NoSuchFieldException e) {
				throw e;
			}
		}
		try {
			while (rs.next()) {
				Card c;
				try {
					c = new Card(rs.getInt("id"));
					cards.add(c.toString());
				} catch (ClassNotFoundException e) {
					throw e;
				} catch (SQLException e) {
					throw e;
				} catch (NoSuchFieldException e) {
					throw e;
				}
			}
		} catch (SQLException e) {
			throw e;
		} catch (ClassNotFoundException e) {
			throw e;
		} catch (NoSuchFieldException e) {
			throw e;
		}
		return cards;
	}
	
	/**
	 * Méthode retournant la liste des cartes enregistrées dans la base de données
	 * au format "id:theme:couleur:[[question]]:[[réponse]]"
	 * @param theme : theme de la carte
	 * @throws ClassNotFoundException : impossible d'accéder au driver
	 * @throws SQLException 
	 * @throws NoSuchFieldException : paramètre non valide
	 */
	public LinkedList<String> readCards (int theme) throws ClassNotFoundException, SQLException, NoSuchFieldException {
		try {
			return readCards(theme,-1);
		} catch (NoSuchFieldException e) {
			throw e;
		} catch (SQLException e) {
			throw e;
		} catch (ClassNotFoundException e) {
			throw e;
		}
	}
	
	/**
	 * Méthode retournant la liste des cartes enregistrées dans la base de données
	 * au format "id:theme:couleur:[[question]]:[[réponse]]"
	 * @throws ClassNotFoundException : impossible d'accéder au driver
	 * @throws SQLException 
	 * @throws NoSuchFieldException : paramètre non valide
	 */
	public LinkedList<String> readCards () throws ClassNotFoundException, SQLException, NoSuchFieldException {
		try {
			return readCards(-1,-1);
		} catch (NoSuchFieldException e) {
			throw e;
		} catch (SQLException e) {
			throw e;
		} catch (ClassNotFoundException e) {
			throw e;
		}
	}
	
	
	
	public static void main(String[] args) {
		ListCards lc;
		try {
			lc = new ListCards();
			System.out.println(lc.readCards());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		}
	}

}
